package com.nature.yanglegeyangultimate.container;


import com.nature.yanglegeyangultimate.domain.Card;
import com.nature.yanglegeyangultimate.util.ReadResourcesUtil;

import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 验卡区容器，只进不出
 */
public class CheckCardContainer {

    //创建一个map集合，key为卡片id，value为卡片对象集合
    public Map<Integer, List<Card>> showCheckCardMap;

    //创建一个map集合，key是卡片id，value为卡片数量
    public Map<Integer, Integer> checkCardMap;

    //验卡区卡牌数量的最大上限
    private static final int MAX_CHECK_CARD = 8;

    //单种卡片的消除上限
    private static final int MAX_CHECK_CARD_ONE = 3;

    //设置一个变量用于控制容器的开闭
    private static boolean isOpen = true;

    //构造函数初始化
    public CheckCardContainer() {
        showCheckCardMap = new HashMap<>();
        checkCardMap = new HashMap<>();
    }

    //点击卡牌，每一次点击翻牌区和中心卡牌区都伴随着一次添加操作
    public boolean addCard(Card card) {

        //0.判断容器是否是开的，如果是开的，执行下面的操作，如果不是，那么就直接返回
        if (!isOpen) {
            return false;
        }

        //1.判断卡牌是否为空
        if (card == null) {
            throw new RuntimeException("添加的卡牌为空");
        }

        //2.判断当前map集合中是否有当前要添加的元素 没有的话，进行对应容器的初始化操作
        if (!showCheckCardMap.containsKey(card.getCardId())) {
            showCheckCardMap.put(card.getCardId(), new ArrayList<>());
            checkCardMap.put(card.getCardId(), 0);
        }

        //4.完成卡牌的添加操作
        showCheckCardMap.get(card.getCardId()).add(card);
        checkCardMap.put(card.getCardId(), checkCardMap.get(card.getCardId()) + 1);

        //打印map中所有Card的Image对象
        for (Card card1 : showCheckCardMap.get(card.getCardId())) {
            System.out.println(card1.getImage());
        }

        //5.判断是否有卡片可以消除
        if (checkCardMap.get(card.getCardId()) == MAX_CHECK_CARD_ONE) {
            //删除展示集合当中的键值对，删除计数map中的键值对
            showCheckCardMap.remove(card.getCardId());
            checkCardMap.remove(card.getCardId());
        }

        //创建一个新的Map
        Map<Image, List<Card>> imageMap = new HashMap<>();
        //遍历展示集合，将Image作为key，Card集合作为value
        for (Map.Entry<Integer, List<Card>> entry : showCheckCardMap.entrySet()) {
            List<Card> cardList = entry.getValue();
            for (Card card1 : cardList) {
                //判断当前集合中是否有该Image对象，如果没有，就添加进去，如果有，就直接跳过
                if (!imageMap.containsKey(card1.getImage())) {
                    imageMap.put(card1.getImage(), new ArrayList<>());
                }
                imageMap.get(card1.getImage()).add(card1);
            }
        }

        for (Map.Entry<Image, List<Card>> entry : imageMap.entrySet()) {
            List<Card> cardList = entry.getValue();
            //判断当前集合的长度是否大于等于3，如果是，就进行消除操作
            if (cardList.size() >= MAX_CHECK_CARD_ONE) {
                //删除对应的键值对
                imageMap.remove(cardList.get(0).getImage());
                //多线程播放音乐
                new Thread(ReadResourcesUtil::playAudioWin).start();
            }
        }

        //清空showMap，将imageMap中的元素重新添加到showCheckCardMap集合中
        showCheckCardMap.clear();
        for (Map.Entry<Image, List<Card>> entry : imageMap.entrySet()) {
            List<Card> cardList = entry.getValue();
            for (Card card1 : cardList) {
                showCheckCardMap.computeIfAbsent(card1.getCardId(), k -> new ArrayList<>());
                showCheckCardMap.get(card1.getCardId()).add(card1);
            }
        }


        isOpen = isNotFull();
        return isOpen;
    }

    public boolean isNotFull() {
        boolean result = true;
        //将checkCardMap集合中的值叠加，如果超过8，游戏失败
        int sum = 0;
        for (Integer value : checkCardMap.values()) {
            sum += value;
        }
        if (sum > MAX_CHECK_CARD) {
            result = false;
        }
        return result;
    }


}
